# -*- coding: utf-8 -*-
# ======================================================
# OpenRouter LLM API 调用示例脚本
# 说明：
# 1. 使用 openai 官方 SDK 调用 OpenRouter API
# 2. 支持通过 prompt 发送用户输入
# 3. 支持文件输入或命令行参数
# 4. 支持可选参数：temperature, top_p, max_tokens
# 5. 支持 verbose 输出调试信息
# ======================================================

import uuid           # 用于生成唯一 query_id
import json           # 用于 JSON 序列化和反序列化
import requests       # 用于发送 HTTP 请求
import os             # 用于读取环境变量和路径处理
import sys            # 用于获取命令行参数
from dotenv import load_dotenv  # 从 .env 文件加载环境变量
from openai import OpenAI  # OpenAI 官方 SDK

load_dotenv()

# ======================================================
# 1. 调用 LLM API 的函数
# ======================================================
def call_llm_api(prompt, 
                 model="deepseek-reasoner",
                 temperature=1.0,
                 top_p=1.0,
                 max_tokens=32000,
                 api_key=None,
                 base_url="https://api.deepseek.com",
                 verbose=False):
    """
    调用 LLM API 获取模型返回结果
    
    Args:
        prompt (str): 用户输入的提示词
        model (str): 使用的模型名称，默认为"deepseek/deepseek-chat-v3-0324:free"
            - DeepSeek: 
                - deepseek/deepseek-chat-v3-0324:free
                - deepseek/deepseek-r1-0528:free
                - deepseek/deepseek-r1:free"
                - deepseek-chat
                - deepseek-reasoner
            - GPT: openai/gpt-oss-20b:free
        temperature (float): 输出随机性，值越大输出越随机
        top_p (float): nucleus 采样参数，控制输出多样性
        max_tokens (int): 最大返回 token 数量
        api_key (str): API 密钥，如果未提供则从环境变量 LLM_ACCESS_TOKEN 读取
        verbose (bool): 是否打印详细调试信息
    
    Returns:
        str: 模型返回的文本结果或错误信息
    """

    # --------------------------------------
    # 1. 获取 API 密钥
    # --------------------------------------
    if api_key is None:
        api_key = os.getenv("LLM_ACCESS_TOKEN")
    if not api_key:
        return "错误: 未提供 API 密钥，请传入参数或设置环境变量 LLM_ACCESS_TOKEN"

    # --------------------------------------
    # 2. 初始化 OpenAI 客户端
    # base_url: OpenRouter API 的基础 URL
    #    - openrouter.ai(free): https://openrouter.ai/api/v1
    #    _ deepseek: https://api.deepseek.com
    # api_key: API 密钥
    # --------------------------------------
    client = OpenAI(
        base_url=base_url, 
        api_key=api_key,
    )

    if verbose:
        print(f"使用模型: {model}")
        print(f"Prompt 输入: {prompt[:100]}{'...' if len(prompt) > 100 else ''}")

    # --------------------------------------
    # 3. 调用接口
    # --------------------------------------
    try:
        completion = client.chat.completions.create(
            model=model,
            messages=[
                {
                    "role": "user", 
                    "content": prompt
                }
            ],
            temperature=temperature,
            top_p=top_p,
            max_tokens=max_tokens,
        )

        return completion.choices[0].message.content

    except Exception as e:
        if verbose:
            print(f"调用 API 出错: {e}")
        return f"错误: {str(e)}"


# ======================================================
# 2. 读取文件内容函数
# ======================================================
def read_file_content(file_path):
    """
    读取文本文件内容
    
    Args:
        file_path (str): 文件路径
    
    Returns:
        str: 文件内容（去除首尾空格），读取失败返回 None
    """
    try:
        with open(file_path, 'r', encoding='utf-8') as f:
            return f.read().strip()
    except Exception as e:
        print(f"读取文件 {file_path} 失败: {e}")
        return None

# ======================================================
# 3. 主函数
# ======================================================
def main():
    """
    主函数，用于测试 API 调用
    支持命令行传入输入文件
    """
    # --------------------------------------
    # 1. 读取命令行参数
    # --------------------------------------
    if len(sys.argv) > 1:
        file_path = sys.argv[1]
        if os.path.exists(file_path):
            print(f"=== 从文件读取输入: {file_path} ===")
            test_prompt = read_file_content(file_path)
            if test_prompt is None:
                return
        else:
            print(f"文件不存在: {file_path}")
            return
    else:
        # 默认测试用例
        test_prompt = "你是什么模型？"
        print("=== 使用默认测试输入 ===")
    
    # 打印前 100 个字符的输入内容
    print(f"输入内容: {test_prompt[:100]}{'...' if len(test_prompt) > 100 else ''}")
    
    # 调用 LLM API
    result = call_llm_api(
        test_prompt,
        model="deepseek/deepseek-chat-v3.1:free",
        base_url="https://openrouter.ai/api/v1", 
        verbose=True)
    
    # 打印结果
    print(f"\n结果: {result}")

# ======================================================
# 4. 程序入口
# ======================================================
if __name__ == "__main__":
    main()
